import com.mysql.jdbc.Connection;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class Test_Jdbc {
    //创建一个数据源,数据源描述了你操作的数据库在哪里
    //数据库是服务器,服务器可能在此主机上也可能在其他主机上
    //需要确定这个服务器的的位置
    //用ip地址+端口号+数据库名 来定位的
    //127.0.0.1  这是一个特殊的ip地址,叫做'环回ip'(loopback)表示本机
    //端口号,一个主机上有很多服务器程序,使用端口号,来区分不同的服务程序  3306mysql默认端口号
    //再通过数据库名确定数据集合
    public static void main(String[] args) throws SQLException {
        DataSource dataSource = new MysqlDataSource();
        //DataSource 是一个接口,不能直接new,JDBC标准库提供的接口MysqlDataSource是mysql驱动包提供的
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("224361");
        //向下转型  转为MysqlDataSource
        //"低耦合""高内聚"
        //耦合指的是两个东西之间的关联性关联性越高,耦合越高
        //代码耦合度高会导致改一个地方,其他地方出现很多bug
        //内聚,有关系的代码放到一起
        Scanner scanner = new Scanner(System.in);
        int id = scanner.nextInt();
        scanner.nextLine();
        String s = scanner.next();
        java.sql.Connection connection = dataSource.getConnection();
        //与数据库建立连接
        String sql = "insert into student values(?,?)";//?是占位符,以后进行替换
        //构造一个sql
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1,id);
        preparedStatement.setString(2,s);//对?进行替换
        //实际上还有Statement但是没有预处理,而一般用PStatement要执行sql需要语法解析使用Statement就和再SQL上一样在服务器上解析
        //但是Ps就不一样了,Ps可以在客户端解析,发给服务器降低了服务器的开销.
        //需要把string  sql转换为语句对象
        int n = preparedStatement.executeUpdate();
        //代码会构造一个网络请求给服务器,并且会等待服务器的相应数据,将响应数据显示在控制台上
        System.out.println("n="+n);
        //把构造好的sql发送给服务器执行
        //最后,释放一些必要的资源
        //内存,创建的变量,都是一些重要的资源,JVM会自动帮助我们回收了(垃圾回收GC)
        //数据库操作PreparedStatement,Connection都是需要我们释放的资源,而DateSource是不需要释放的,只是单纯的保存了几个信息.
        preparedStatement.close();
        connection.close();
        //很多时候释放都是使用close
        //**--释放的顺序与创建的顺序相反 --**
    }
    //DataSources 数据源,描述了数据服务库在哪里
    //Connection连接,需要先建立连接才能进行之后的操作
    //PreparedStatement 基于连接生成,将语句对象发送给服务器


}
